Oracle 行列转换(一) case行列转换思路简析 | 您所在的位置:网站首页 › oracle case when语句使用详解 › Oracle 行列转换(一) case行列转换思路简析 |
思路简析:
1° 准备测试数据: drop table t purge; create table t(a varchar2(10), b varchar2(10)); insert into t values('a1','b1'); insert into t values('a1','b2'); commit;2° 进行行列转换的数据一般是”某一列”存在重复冗余的数据,如: select * from t;3° 生成新列: select a, b, case b when 'b1' then '第1个列值生成新第1列' else null end as b1, case b when 'b2' then '第2个列值生成新第2列' else null end as b2 from t;4° case语法较为臃肿,使用decode函数进行改写: select a, b, decode(b,'b1','第1个列值生成新第1列',null) as b1, decode(b,'b2','第2个列值生成新第2列',null) as b2 from t;5° 我们已经将B列列值展开成多列,因此剔除B列展示,然后先查看展开生成的第一列,观察特点: select a, -- b, decode(b,'b1','第1个列值生成新第1列',null) as b1 -- , -- decode(b,'b2','第2个列值生成新第2列',null) as b2 from t;6° 另外一种方法是依据A列分组,对B1列进行聚合处理,因为B1是字符串,使用max或者min均可过滤掉空值: select a, -- b, min(decode(b,'b1','第1个列值生成新第1列',null)) as b1 -- , -- decode(b,'b2','第2个列值生成新第2列',null) as b2 from t group by a;7° 将所有展开列都依此处理,得出最后SQL: select a, -- b, min(decode(b,'b1','第1个列值生成新第1列',null)) as b1, max(decode(b,'b2','第2个列值生成新第2列',null)) as b2 from t group by a;8° 简单总结: 字段值重复是行列转换的基础,如果不存在冗余数据列,则无法进行行列转换 行列转换的方法就是使用case或者decode对冗余数据列之外的其他列的列值进行展开 然后依据冗余数据列分组聚合,最后形成行列转换的功能[TOC] |
CopyRight 2018-2019 实验室设备网 版权所有 |